package vuelo;

import java.math.BigDecimal;
import java.util.Collection;
import java.util.Date;
import java.util.concurrent.CopyOnWriteArrayList;

import utils.fecha.Fecha;
import aerolinea.TodasLasAerolineas;
import asiento.Asiento;
import busqueda.Busqueda;
import filtro.Filtro;

public class VueloDirecto extends Vuelo {
	
	private TodasLasAerolineas controladorPopularidad;
	private Collection<Asiento> asientos;
	private String origen;
	private String destino;
	private String codigoDeVuelo;
	private Date fechaSalida;
	private Date fechaLLegada;
	private Collection<Asiento> compras;
	
	public VueloDirecto(String codigoVuelo,Asiento asiento) {
		this.setCodigoDeVuelo(codigoVuelo);
		this.setOrigen(asiento.getOrigen());
		this.setDestino(asiento.getDestino());
		this.setFechaLLegada(asiento.getFechaLlegada());
		this.setFechaSalida(asiento.getFechaSalida());
		this.setAsientos(new CopyOnWriteArrayList<Asiento>());
		this.setCompras(new CopyOnWriteArrayList<Asiento>());
		this.setControladorPopularidad(TodasLasAerolineas.getInstance());
		Fecha fechaController = new Fecha();
		this.setTiempoDeVuelo(new BigDecimal(fechaController.horasEntreFechas(this.getFechaSalida(),this.getFechaLLegada())));
	}

	@Override
	public BigDecimal dameTiempoDeVuelo() {
		//Fecha fechaController = new Fecha();
		//return new BigDecimal(fechaController.horasEntreFechas(this.getFechaSalida(),this.getFechaLLegada()));
		return getTiempoDeVuelo();
	}

	@Override
	public BigDecimal damePrecioMaximo() {
		BigDecimal precio = new BigDecimal(0);
		for (Asiento asiento : asientos) {
			precio = (asiento.getPrecio().max(precio));
		}
		return precio;
	}

	@Override
	public BigDecimal damePopularidad(){
		return this.getControladorPopularidad().obtenerPopularidad(this);
	}
	
	public BigDecimal horasEntre(VueloDirecto vueloAnterior) {
		Fecha fechaController = new Fecha();
		long diferencia = 0;
		//por si es el primer vuelo
		if(vueloAnterior!=null){
			diferencia = fechaController.horasEntreFechas(vueloAnterior.getFechaLLegada(),this.getFechaSalida());
		}
		return new BigDecimal(diferencia);
	}
	
	@Override
	public Vuelo filtrar (Filtro filtro, Busqueda busqueda){
		return filtro.filtrarVueloDirecto(this, busqueda);
	}
	//util para el mock
	public Asiento obtenerUltimoAsiento() {
		for (Asiento asiento : asientos) {
			return asiento;
		}
		return null;
	}

	public void setCompras(Collection<Asiento> compras) {
		this.compras = compras;
	}
	public Collection<Asiento> getCompras() {
		return compras;
	}
	public TodasLasAerolineas getControladorPopularidad() {
		return controladorPopularidad;
	}
	public void setControladorPopularidad(TodasLasAerolineas controladorPopularidad) {
		this.controladorPopularidad = controladorPopularidad;
	}
	public void addAsiento(Asiento asiento) {
		this.asientos.add(asiento);
	}
	
	public void setAsientos(Collection<Asiento> asientos) {
		this.asientos = asientos;
	}

	public Collection<Asiento> getAsientos() {
		return asientos;
	}

	public void setOrigen(String origen) {
		this.origen = origen;
	}

	public String getOrigen() {
		return origen;
	}

	public void setDestino(String destino) {
		this.destino = destino;
	}

	public String getDestino() {
		return destino;
	}

	public Date getFechaSalida() {
		return fechaSalida;
	}

	public void setFechaSalida(Date fechaSalida) {
		this.fechaSalida = fechaSalida;
	}

	public Date getFechaLLegada() {
		return fechaLLegada;
	}

	public void setFechaLLegada(Date fechaLLegada) {
		this.fechaLLegada = fechaLLegada;
	}

	public void setCodigoDeVuelo(String codigoDeVuelo) {
		this.codigoDeVuelo = codigoDeVuelo;
	}

	public String getCodigoDeVuelo() {
		return codigoDeVuelo;
	}
	
	public  String toString(){
		return codigoDeVuelo;
	}
	
}
